本篇总结
使用 MCO,从 PA8 输出系统时钟分频信号。
🔑 KEIL MDK、UART调试、MCO
硬件平台:本例程基于 W55MH32L-EVB 开发板运行。
采购推荐:点击前往 WIZnet 官方淘宝店铺 选购 W55MH32L-EVB
本示例演示 MCO(Microcontroller Clock Output,微控制器时钟输出)功能,将内部时钟信号通过 PA8 引脚输出到外部,便于时钟测量、同步或为其他器件提供时钟源。W55MH32 的 MCO 支持输出 SYSCLK(系统时钟)、HSI(内部高速时钟)、HSE(外部高速时钟)以及 PLLCLK 的多种分频输出。本示例输出 PLL 时钟 16 分频信号(PLLCLK/16 = 4.5MHz)到 PA8,可通过示波器测量验证。
前置工具准备
开始本例程前,请确认以下工具已安装:
- WIZ UartTool V1.0:串口调试工具:点击下载
硬件连接
本例程使用 PA8 引脚输出时钟信号(MCO 功能)。用示波器探头连接 PA8 可测量输出时钟的频率和波形。USART1 用于输出调试信息。
| 引脚 | 功能 | 方向 | 模式 |
| PA8 | MCO(时钟输出) | 开发板 → 示波器 | 复用推挽输出 (AF_PP) |
| PA9 | USART1_TX | 开发板 → PC | 复用推挽输出 (AF_PP) |
| PA10 | USART1_RX | PC → 开发板 | 浮空输入 (IN_FLOATING) |
工程结构
工程位于 SDK 内 1.SDK\ModuleDemo\MCO\,核心文件如下:
MCO/
├── USER/
│ ├── main.c ← MCO配置 + 时钟输出
│ ├── w55mh32_conf.h ← 外设头文件集中包含
│ ├── w55mh32_it.c/h ← 中断服务函数
│ ├── system_w55mh32.c/h← 系统初始化(时钟配置)
│ └── startup_w55mh32.s ← 启动文件
└── SYSTEM/
└── delay/
└── delay.c/h ← SysTick 延时函数
步骤1:MCO 配置与时钟输出
文件:USER/main.c — 配置 PA8 为复用推挽输出(MCO_GpioConfig()),通过 RCC_ClkConfiguration() 配置 PLL(HSE×9 = 72MHz),再调用 RCC_MCOConfig(RCC_MCO_PLLCLK_Div16) 选择输出 PLL 16 分频(4.5MHz)。
void MCO_GpioConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* PA8: MCO → 复用推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void RCC_ClkConfiguration(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
RCC_PLLCmd(DISABLE);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* HSE 8MHz × 9 = 72MHz */
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
}
int main(void)
{
RCC_ClocksTypeDef clocks;
delay_init();
RCC_ClkConfiguration();
UART_Configuration(115200);
printf("MCO Out Pll Div Test.\n");
RCC_GetClocksFreq(&clocks);
printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",
(float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
(float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);
MCO_GpioConfig();
RCC_MCOConfig(RCC_MCO_PLLCLK_Div16); /* PLL(72MHz) / 16 = 4.5MHz 输出到 PA8 */
while (1);
}
MCO 配置只需两步:配置 PA8 为复用推挽输出(GPIO_Mode_AF_PP),调用 RCC_MCOConfig() 选择时钟源。PA8 是 MCO 的固定输出引脚,不可更改。本例使用 RCC_MCO_PLLCLK_Div16 输出 PLL 16 分频(72MHz/16 = 4.5MHz)。
如果你想自定义
- 换时钟源 → 修改
RCC_MCOConfig() 参数:RCC_MCO_HSI(8MHz)、RCC_MCO_HSE(8MHz)、RCC_MCO_PLLCLK_Div2(36MHz)、RCC_MCO_PLLCLK_Div16(4.5MHz)
- 为外部器件提供时钟 → 将 PA8 连接到外部芯片的时钟输入引脚,MCO 可作为外部器件的时钟源
运行验证
下载固件并按 RESET 后,PA8 引脚输出 PLL 16 分频时钟信号(4.5MHz)。使用示波器探头连接 PA8,可观察到方波时钟信号。串口打印系统时钟信息与 "MCO Out Pll Div Test." 提示信息。
示波器测量 PA8 引脚 MCO 输出波形:时钟信号频率与配置的时钟源一致常见问题
Q: PA8 无时钟信号输出
确认 PA8 配置为复用推挽输出(GPIO_Mode_AF_PP)。检查 RCC_MCOConfig 参数是否正确。确认 GPIO 速度设置为 GPIO_Speed_50MHz。
Q: 示波器测量频率不正确
检查系统时钟配置,通过 RCC_GetClocksFreq 确认实际 SYSCLK 频率。确认 RCC_MCOConfig 参数与预期一致(本例为 RCC_MCO_PLLCLK_Div16,输出 4.5MHz)。
Q: MCO 是否可以输出到其他引脚
MCO 输出固定在 PA8 引脚,不可更改。如果需要其他引脚输出时钟,可使用定时器的 PWM 输出功能生成时钟信号。
总结
本文基于 W55MH32 的 MCO 功能实现了微控制器时钟输出:
- MCO 输出:PA8 复用推挽输出,通过
RCC_MCOConfig() 选择时钟源
- 支持输出 SYSCLK、HSI(8MHz)、HSE(8MHz) 以及 PLLCLK 的多种分频(Div2/Div16 等)时钟源
- 可用于时钟测量验证、外部器件时钟源提供、系统时钟同步等场景
- PA8 是 MCO 固定输出引脚,本例输出 PLLCLK/16(4.5MHz)